﻿using System;
using System.Linq;
using System.Linq.Expressions;
using MathService.MathParser.ExpressionTrees.Nodes;

namespace MathService.MathParser
{
    public abstract class ComplexOperatorItem : ExpressionItem
    {
        protected ComplexOperatorItem(string Name) : base(Name) { }

        /// <summary>Метод определения значения</summary>
        /// <returns>Численное значение элемента выражения</returns>
        public override double GetValue() { throw new NotSupportedException(); }

        public abstract double GetValue(MathExpression ParametersExpression, MathExpression Function);

        /// <summary>Скомпилировать в выражение</summary>
        /// <returns>Скомпилированное выражение System.Linq.Expressions</returns>
        public abstract Expression Compile(MathExpression ParametersExpression, MathExpression Function);

        /// <summary>Скомпилировать в выражение</summary>
        /// <param name="Function">Выражение ядра функции</param>
        /// <param name="Parameters">Массив параметров</param>
        /// <param name="ParametersExpression">Выражение параметров</param>
        /// <returns>Скомпилированное выражение System.Linq.Expressions</returns>
        public abstract Expression Compile(MathExpression ParametersExpression, MathExpression Function, ParameterExpression[] Parameters);

        /// <summary>Инициализация оператора</summary>
        /// <param name="Parameters">Блок параметров</param>
        /// <param name="Function">Блок ядра функции</param>
        /// <param name="Parser">Парсер мат.выражения</param>
        /// <param name="Expression">Внешнее мат.выражение</param>
        public virtual void Initialize(MathExpression Parameters, MathExpression Function, ExpressionParser Parser,
                    MathExpression Expression)
        {
            
        }
    }
}